From: kaf24@firebug.cl.cam.ac.uk Date: Fri, 19 May 2006 15:10:52 +0000 (+0100) Subject: Several page allocations, done in the hypervisor when starting an HVM X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~16047^2~23^2 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=573e986d56c848a3e8901f30ad7740c92d1ed23b;p=xen.git Several page allocations, done in the hypervisor when starting an HVM domain, are not checked. This can cause the physical machine to crash when starting the HVM domain during low-memory conditions. Kudos to Charles Arnold for catching the problem with shadow_direct_map_init. Signed-off-by: Charles Coffing --- diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index e5a3c89703..a0844e4edf 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -189,7 +189,11 @@ void hvm_setup_platform(struct domain* d) if ( !hvm_guest(current) || (current->vcpu_id != 0) ) return; - shadow_direct_map_init(d); + if ( shadow_direct_map_init(d) == 0 ) + { + printk("Can not allocate shadow direct map for HVM domain.\n"); + domain_crash_synchronous(); + } hvm_map_io_shared_page(d); hvm_get_info(d); diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index 2541a140f9..96e0d31b7f 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -458,6 +458,9 @@ int start_svm(void) if (!(test_bit(X86_FEATURE_SVME, &boot_cpu_data.x86_capability))) return 0; + svm_globals[cpu].hsa = alloc_host_save_area(); + if (! svm_globals[cpu].hsa) + return 0; rdmsr(MSR_EFER, eax, edx); eax |= EFER_SVME; @@ -466,7 +469,6 @@ int start_svm(void) printk("AMD SVM Extension is enabled for cpu %d.\n", cpu ); /* Initialize the HSA for this core */ - svm_globals[cpu].hsa = alloc_host_save_area(); phys_hsa = (u64) virt_to_maddr( svm_globals[cpu].hsa ); phys_hsa_lo = (u32) phys_hsa; phys_hsa_hi = (u32) (phys_hsa >> 32); diff --git a/xen/arch/x86/hvm/svm/vmcb.c b/xen/arch/x86/hvm/svm/vmcb.c index 3917650a4f..44c87335d6 100644 --- a/xen/arch/x86/hvm/svm/vmcb.c +++ b/xen/arch/x86/hvm/svm/vmcb.c @@ -139,18 +139,21 @@ static int construct_vmcb_controls(struct arch_svm_struct *arch_svm) /* The following is for I/O and MSR permision map */ iopm = alloc_xenheap_pages(get_order_from_bytes(IOPM_SIZE)); - - ASSERT(iopm); - memset(iopm, 0xff, IOPM_SIZE); - clear_bit(PC_DEBUG_PORT, iopm); + if (iopm) + { + memset(iopm, 0xff, IOPM_SIZE); + clear_bit(PC_DEBUG_PORT, iopm); + } msrpm = alloc_xenheap_pages(get_order_from_bytes(MSRPM_SIZE)); - - ASSERT(msrpm); - memset(msrpm, 0xff, MSRPM_SIZE); + if (msrpm) + memset(msrpm, 0xff, MSRPM_SIZE); arch_svm->iopm = iopm; arch_svm->msrpm = msrpm; + if (! iopm || ! msrpm) + return 1; + vmcb->iopm_base_pa = (u64) virt_to_maddr(iopm); vmcb->msrpm_base_pa = (u64) virt_to_maddr(msrpm);